<?php

/**
 * 框架初始化功能类
 */
class Framework {

    /**
     * 入口
     */
    public static function run() {
        //声明路径常量
        static::_initPathConst();
        //初始化配置config
        static::_initConfig();
        //确定分发参数
        static::_initDispatchParam();
        //当前平台相关的路径常量
        static::_initPlatformPathConst();
        //注册自动加载
        static::_initAutoload();
        //请求分发
        static::_dispatch();
    }

    /**
     * 声明路径常量
     */
    private static function _initPathConst() {
        //目录基础常量的定义
        define('DS', DIRECTORY_SEPARATOR);
        define('ROOT_PATH', getcwd() . DS);
        define('APPLICATION_PATH', ROOT_PATH . 'application' . DS);
        define('CONFIG_PATH', APPLICATION_PATH . 'config' . DS);
        define('FRAMEWORK_PATH', ROOT_PATH . 'framework' . DS);
        define('TOOL_PATH', FRAMEWORK_PATH . 'tool' . DS);
        define('DAO_PATH', FRAMEWORK_PATH . 'dao' . DS);
        define('HELPER_PATH', FRAMEWORK_PATH . 'helpers' . DS);
    }

    /**
     * 初始化配置信息
     */
    private static function _initConfig() {
        // 存储于全局变量，可以在整个项目中都是用该配置数据
        $GLOBALS['config'] = require CONFIG_PATH. 'application.config.php';
    }

    /**
     * 初始化分发参数
     */
    private static function _initDispatchParam() {
        //确定分发参数
        //平台
        $default_platform = @$GLOBALS['config']['app']['default_platform'];
        define('PLATFORM', isset($_REQUEST['p']) ? $_REQUEST['p'] : $default_platform);
        //控制器
        $default_controller = @$GLOBALS['config'][PLATFORM]['default_controller'];//获取当前平台下的默认控制器
        define('CONTROLLER', isset($_REQUEST['c']) ? ucfirst($_REQUEST['c']) : $default_controller);
        //动作
        $default_action = @$GLOBALS['config'][PLATFORM]['default_action'];
        define('ACTION', isset($_REQUEST['a']) ? $_REQUEST['a'] : $default_action);
    }

    /**
     * 声明当前平台路径常量
     */
    private static function _initPlatformPathConst() {
        //当前平台相关的路径常量
        define('CURRENT_CONTROLLER_PATH', APPLICATION_PATH . PLATFORM . DS . 'controller' . DS);
        define('CURRENT_MODEL_PATH', APPLICATION_PATH . PLATFORM . DS . 'model' . DS);
        define('CURRENT_VIEW_PATH', APPLICATION_PATH . PLATFORM . DS . 'view' . DS);
    }

    /**
     * 自动加载方法
     * @param string $class_name
     */
    public static function userAutoload($class_name) {
        $framework_class_list = array(
            //'类名' => '类文件地址'
            'Controller'    => FRAMEWORK_PATH . 'Controller.class.php',
            'Model'         => FRAMEWORK_PATH . 'Model.class.php',
            'Factory'       => FRAMEWORK_PATH . 'Factory.class.php',
            'MySQLDB'       => DAO_PATH . 'MySQLDB.class.php',
            'PDODB'         => DAO_PATH . 'PDODB.class.php',
            'I_DAO'         => DAO_PATH . 'I_DAO.interface.php',
            'SessionDB'     => TOOL_PATH . 'SessionDB.class.php',
            'Captcha'       => TOOL_PATH . 'Captcha.class.php',
            'Image'         => TOOL_PATH . 'Image.class.php',
            'Page'          => TOOL_PATH . 'Page.class.php',
            'Upload'        => TOOL_PATH . 'Upload.class.php',
        );
        //判断是否为核心类
        if(isset($framework_class_list[$class_name])) {
            //是核心类
            require $framework_class_list[$class_name];
        }
        //判断是否为可增加（控制器类，模型类）
        //控制器类，截取后10个字符，匹配Controller
        elseif (substr($class_name, -10) === 'Controller') {
            //控制器类，当前平台下的controller目录下
            require CURRENT_CONTROLLER_PATH . $class_name . '.class.php';
        }
        //模型类, 截取后5个字符,匹配Model
        elseif (substr($class_name, -5) === 'Model') {
            require CURRENT_MODEL_PATH . $class_name . '.class.php';
        }
    }

    /**
     * 注册自动加载
     */
    private static function _initAutoload() {
        spl_autoload_register(array(__CLASS__, 'userAutoload'));
    }

    /**
     * 分发请求
     */
    private static function _dispatch() {
        //实例化控制器类，请调用动作方法
        $controller_name = CONTROLLER . 'Controller';
        //实例化
        $controller = new $controller_name();   //可变类
        //调用方法（Action）
        $action_name = ACTION . 'Action';
        $controller->$action_name();            //可变方法
    }
}